module.exports = app => {
  const express = require('express');
    // jsonwebtoken  用于生成 token
  const jwt = require('jsonwebtoken');
    // 引入数据集合
  const AdminUser = require('../../models/Admin-user');
    // http-assert 用于提示错误
  const assert = require('http-assert');

  // 子路由
  const router = express.Router({
    mergeParams: true
  });
  
  // 更新资源
  router.post('/', async(req, res) => {
    const model = await req.Model.create(req.body);
    // 把 model 发送给前端
    res.send(model);
  })

  // 请求资源列表
  router.get('/', async(req, res) => {
    const queryOptions = {}
    if (req.Model.modelName === 'Category') {
      queryOptions.populate = 'parent'
    } else if (req.Model.modelName === 'Hero') {
      queryOptions.populate = 'categories'
    }
    const items = await req.Model.find().setOptions(queryOptions).limit(100);
    // 把 items 发送给前端
    res.send(items);
  })

  // 获取某一个资源
  router.get('/:id', async(req, res) => {
    console.log(req);
    const model = await req.Model.findById(req.params.id);
    // 把 items 发送给前端
    res.send(model);
  })

  // 修改资源
  router.put('/:id', async(req, res) => {
    // 查到数据
    const item = await req.Model.findByIdAndUpdate(req.params.id, req.body);
    // 发送给前端
    res.send(item);
  })

  // 删除资源
  router.delete('/:id', async(req, res) => {
    // 查到数据
    await req.Model.findByIdAndDelete(req.params.id);
    res.send({
      success: true,
    })
  })

  // 登录校验中间件 （校验 token）
  const authMiddleware = require('../../middleWare/auth');

  const resourceMiddleware = require('../../middleWare/resource');

  // 挂载路由
  app.use('/admin/api/rest/:resource', authMiddleware(), resourceMiddleware(), router);

  // 图片加载
  const multer = require('multer');
  // __dirname 表示绝对路径， 从当前文件的路径查找
  const upload = multer({ dest: __dirname + './../../uploads' });

  // ****************** 图片加载没有使用中间件登录验证 ********************
  app.post('/admin/api/upload', upload.single('file'), async(req, res) => {
    const file = req.file
    // 上线后 把 localhost：3000 改成线上地址
    file.url = `http://localhost:3000/uploads/${file.filename}`;
    res.send(file)
  })

  // 登录
  app.post('/admin/api/login', async(req, res) => {
    const { username, password } = req.body

    // 1. 根据用户名查找用户
    const user = await AdminUser.findOne({username}).select('+password');
    assert(user, 422, '用户不存在')
    // if (!user) {
    //   return res.status(422).send({
    //     message: '用户不存在'
    //   })
    // }

    // 2. 校验密码
    const isValid = require('bcrypt').compareSync(password, user.password);
    assert(isValid, 422, '用户名或密码错误')
    // if (!isValid) {
    //   return res.status(422).send({
    //     message: '用户名或密码错误'
    //   })
    // }
    
    // 3. 返回token
    const token = jwt.sign({ id: user._id }, app.get('secret'))
    res.send({token});
  })

  // 错误处理函数
  app.use(async(err, req, res, next) => {
    // console.log(err);
    res.status(err.statusCode || 500).send({
      message: err.message
    })
  })
}